package com.zhaoqi.hr.repository;

import com.zhaoqi.hr.entity.UserDocument;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * 用户文档数据访问层
 */
@Repository
public interface UserDocumentRepository extends JpaRepository<UserDocument, Long> {

    /**
     * 根据用户ID查询文档列表，按创建时间倒序
     */
    List<UserDocument> findByUserIdOrderByCreatedAtDesc(Long userId);

    /**
     * 根据审核状态查询文档列表，按创建时间正序（用于管理员审核）
     */
    Page<UserDocument> findByAuditStatusOrderByCreatedAtAsc(UserDocument.AuditStatus auditStatus, Pageable pageable);

    /**
     * 根据用户ID和文档类型查询文档
     */
    List<UserDocument> findByUserIdAndDocumentType(Long userId, UserDocument.DocumentType documentType);

    /**
     * 根据用户ID和审核状态查询文档数量
     */
    long countByUserIdAndAuditStatus(Long userId, UserDocument.AuditStatus auditStatus);

    /**
     * 统计用户文档数量
     */
    @Query("SELECT COUNT(d) FROM UserDocument d WHERE d.userId = :userId")
    long countDocumentsByUserId(@Param("userId") Long userId);

    /**
     * 根据用户ID统计文档数量
     */
    long countByUserId(Long userId);

    /**
     * 根据审核状态查找文档（按创建时间升序）
     */
    List<UserDocument> findByAuditStatusOrderByCreatedAtAsc(UserDocument.AuditStatus auditStatus);

    /**
     * 查询用户已通过审核的文档
     */
    @Query("SELECT d FROM UserDocument d WHERE d.userId = :userId AND d.auditStatus = 'APPROVED'")
    List<UserDocument> findApprovedDocumentsByUserId(@Param("userId") Long userId);

    /**
     * 查询待审核文档数量
     */
    long countByAuditStatus(UserDocument.AuditStatus auditStatus);

    /**
     * 根据审核人ID查询审核过的文档
     */
    List<UserDocument> findByAuditUserIdOrderByAuditTimeDesc(Long auditUserId);
    
    /**
     * 根据用户ID查询文档列表
     */
    List<UserDocument> findByUserId(Long userId);
    
    /**
     * 根据用户ID删除文档
     */
    void deleteByUserId(Long userId);
}
